package main

import (
	"fmt"
	"time"
)

/*
select 语句可以实现多路复用
多路复用可以简单地理解为，
N 个 channel 中，任意一个 channel 有数据产生，
select 都可以监听到，
然后执行相应的分支，
接收数据并处理。
*/
func main() {
	ch1 := make(chan string, 5)
	ch2 := make(chan string, 5)
	ch3 := make(chan string, 5)

	go func() {
		ch1 <- downloadFile("first")
	}()

	go func() {
		ch2 <- downloadFile("second")
	}()

	go func() {
		ch3 <- downloadFile("third")
	}()

	//开始select多路复用，哪个channel能获取到值，
	//就说明哪个最先下载好，就用哪个。
	select {
	case <-ch1:
		fmt.Println("ch1")
	case <-ch2:
		fmt.Println("ch2")
	case <-ch3:
		fmt.Println("ch3")

	}
}

func downloadFile(chanName string) string {
	time.Sleep(time.Second)
	return chanName + ":filePath"
}
